package arithmetic2;

/**
 * @author macpro
 * @date 2019-07-28
 * @function
 * 给出一个 32 位的有符号整数，你需要将这个整数中每位上的数字进行反转。
 *
 * 示例 1:
 *
 * 输入: 123
 * 输出: 321
 *  示例 2:
 *
 * 输入: -123
 * 输出: -321
 * 示例 3:
 *
 * 输入: 120
 * 输出: 21
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/reverse-integer
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class T_007_ReverseInteger {
    public static void main(String[] args) {
        System.out.println(Integer.MAX_VALUE);
        System.out.println(Integer.MIN_VALUE);
//        System.out.println(Long.parseLong("0321"));
//        System.out.println((-123/1000));
//        System.out.println(reverse(-123));
        System.out.println(reverseNullPoll(123));
    }

    // TODO: 2019-07-28 mySelf
    //1 题目，细节，边界
    // 假设我们的环境只能存储得下 32 位的有符号整数，则其数值范围为 [−2^31,  2^31 − 1]。请根据这个假设，如果反转后整数溢出那么就返回 0。

    //2 possible solution
    //3 codeing
    //4 test cases
    public static int reverse(int x) {
        //1 10进制每一位是什么
        //2 反转拼接
        long num = x;
        boolean isReverse = false;
        if (x<0){
            isReverse = true;
            num = -num;
        }
        String str="0";//为了 防止x==0 ,""parse 错误
        while (num!=0){
            str= str +(num%10);
            num = num / 10;
        }
        System.out.println("res str "+str);
        long l = Long.parseLong(str);
        return (l>Integer.MAX_VALUE||l<Integer.MIN_VALUE)?0:isReverse?(int) -l:(int)l;
    }


    /**
     * 反转整数的方法可以与反转字符串进行类比。
     *
     * 我们想重复“弹出”x 的最后一位数字，并将它“推入”到
     *
     * 要在没有辅助堆栈 / 数组的帮助下 “弹出” 和 “推入” 数字，我们可以使用数学方法。
     *
     * 但是，这种方法很危险，因为当
     * temp = rev ⋅ 10 + pop
     *
     * todo temp=rev⋅10+pop 时会导致溢出。
     *
     * 幸运的是，事先检查这个语句是否会导致溢出很容易。
     *
     * 作者：LeetCode
     * 链接：https://leetcode-cn.com/problems/two-sum/solution/zheng-shu-fan-zhuan-by-leetcode/
     * 来源：力扣（LeetCode）
     * 著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。
     * @param x
     * @return
     */
    public static int reverseNullPoll(int x){
        int rev = 0;
        while (x!=0){
           int pop = x%10;
           if (rev > Integer.MAX_VALUE/10 || ( rev ==Integer.MAX_VALUE/10 && pop>7)){
                return 0;
           }
           if (rev < Integer.MIN_VALUE/10 || (rev == Integer.MIN_VALUE/10 && pop<-8)){
               return 0;
           }
            x = x/10;
            rev = rev*10+pop;
        }

        return rev;
    }


}
